// =====================================================================================
// 
//       Filename:  Giocatore.cpp
// 
//    Description:  Implementazione della classe Giocatore
// 
//         Author:  Davide Poletti , davide.pole@gmail.com
//					Paolo Pigato , p.pigato@hotmail.com	
//        Company:  P&P.cpp
// 
// =====================================================================================

#include "Giocatore.hh"

Giocatore::Giocatore(int dim_mare)
{
    _mare_mio = Mare(dim_mare, 1);
    _mare_avv = Mare(dim_mare, 0);
    list<Nave*> _navi_mie;
    _nave_colpite = new Nave0(0);
    _nave_affondate = new Nave0(1);
}

int Giocatore::subisci_sparo(pair<int, int> coor)
{
    int esito = _mare_mio.subisci_sparo(coor);    
	if (sconfitto()){
        esito = 4;
    }
    return esito;
}

void Giocatore::affonda_nave(pair<int, int> coor)
{
	Casella* casella = _mare_avv[coor];
	casella->punta_nave(_nave_affondate);
    for (int angle = 0; angle < 4; angle++){
    	pair<int, int> c = coor;
		bool nave_da_affondare;                       
    	do {            
			_mare_avv[c]->punta_nave(_nave_affondate);
     	  	c = _mare_avv.vai_successiva(c, angle);
			if (_mare_avv.in_mare(c)){
				if(_mare_avv[c]->nave_qui()){
				nave_da_affondare = true;
				} else {
					nave_da_affondare = false;
				}
			}else{
			nave_da_affondare = false;
			}
		} while (nave_da_affondare);
	}
}

void Giocatore::aggiorna_con_esito(pair<int, int> coor, int esito)
{
    Casella* casella = _mare_avv[coor];
    casella->subisci_sparo();
    switch (esito){
        case 0 : cout << "Giocatore Attacco: errore, hai già sparato qui"<< endl;
				 break;
        case 1 : casella->punta_nave(0);
                 break;
        case 2 : casella->punta_nave(_nave_colpite);
                 break;
        case 3 : affonda_nave(coor);
				 break;
        case 4 : affonda_nave(coor);
				 cout << endl << "Tutte le navi sono affondate" << endl;
                 cout << "Il mare avversario" << endl;
				 cout << _mare_avv << endl;
                 cout << "Il tuo mare" << endl;
				 cout << _mare_mio << endl;
                 break;
        default : cout << "Giocatore Attacco: errore, esito non contemplato" << endl;
                  break;
    }
}

bool Giocatore::sconfitto()
{
    bool affondate = true;
    list<Nave*>::iterator na;
    for (na = _navi_mie.begin(); na != _navi_mie.end(); na++){
        affondate = affondate && (*na)->affondata();
    }
    return affondate;
}

Nave* Giocatore::crea_nave(int dim_nave, pair<int, int> posizione, int orientamento)
{
    Nave* nave;
    switch (dim_nave){
        case 1 : nave = new Nave1(posizione, orientamento);
                 break;
        case 2 : nave = new Nave2(posizione, orientamento);
                 break;
        case 3 : nave = new Nave3(posizione, orientamento);
                 break;
        case 4 : nave = new Nave4(posizione, orientamento);
                 break;
        case 5 : nave = new Nave5(posizione, orientamento);
                 break;
        default: cout << "Giocatore: Errore nella creazione delle navi"<<endl;
    }
    return nave;
}
